package 富婆梦.第一阶段.第二周.作业;

import java.util.Random;

/**
 * 用于描述枪的类
 * 持有状态：
 * 1、子弹数量->bullet
 * 2、弹膛->dantang[]
 * 3、撞针->needle
 * 状态的约束条件：（假设弹膛数组长度为X）
 * （1）子弹数量为区间内的整数[0,X]
 * （2）弹膛必须为大于0的整数数组
 * （3）弹膛被初始化后，不能再修改
 * （4）子弹初始化时，应该为0
 * （5）撞针值的取值范围为[0,X]要小于弹膛的长度
 * 拥有行为：
 * 1、构造函数->Gun()（在创建对象时，就将弹膛初始化，并不支持修改）
 * 2、获取弹膛长度（只返回数组长度）->getDantang()
 * 3、获取撞针位置的值->getNeedlel()
 * 4、获取子弹数量->getBullet()
 * 5、子弹上膛->putBullet()
 * 3、转动弹膛->turn()
 * 4、发射子弹->shoot()
 */
public class Gun {
    /**
     *
     */
//    private int bullet;
    private boolean[] dantang;
    private int needlel;

    Gun(){
        this.dantang = new boolean[12];
        this.needlel = 0;
    }

    public int getDantang(){
        return dantang.length;
    }

    public int getNeedlel(){
        return needlel;
    }

    public boolean shoot(){
        boolean be_shoot = false;
        if (dantang[needlel] == true){//有子弹
            dantang[needlel] = false;
            be_shoot = true;
            needlel = needlel+1;
        }else {//无子弹
            needlel = needlel+1;
            be_shoot = false;
        }
        if (needlel >= dantang.length){
            needlel = 0;
        }
        return be_shoot;
    }

    public void putBullet(int index){
        if (dantang[index] == false){
            dantang[index] = true;
        }
    }

    public int getBullet(){
        int bullet = 0;
        for (boolean x:dantang){
            if (x==true){
                bullet = bullet+1;
            }
        }
        return bullet;
    }

    public void turn(){
        //转动转轮：确定开枪发射子弹的位置
        needlel=new Random().nextInt(dantang.length-1);
    }

    public static void main(String[] args) {
        Gun gun = new Gun();
        //测试点1：开空枪
        test2(gun);

        // 测试点2：子弹上膛
        test1(gun);

        // 测试点3：转动转轮
        test3(gun);

        System.out.println("开枪前，子弹有多少颗：" + gun.getBullet());
        //测试点4：有子弹开枪
        test2(gun);

        //测试点5：开完枪后获取子弹数量
        System.out.println("开完枪后，子弹还有多少颗：" + gun.getBullet());

    }

    //往枪里面放子弹
    private static void test1(Gun gun){
        for(int i = 0;i<3;i++){
            while (true){
                int x = new Random().nextInt(gun.getDantang()-1);
                if (gun.dantang[x] == false){
                    gun.putBullet(x);
                    break;
                }
            }
        }
//        for (boolean a:gun.dantang){
//            System.out.println(a);
//        }

    }
    //开枪
    private static void test2(Gun gun){
        for (Boolean x:gun.dantang){
            System.out.println("开枪前每个弹膛是否有子弹"+x);
        }
        for (int i = 0;i<12;i++){
            gun.shoot();
        }
        System.out.println("--------------------------------");
        for (Boolean x:gun.dantang){
            System.out.println("开枪后每个弹膛是否有子弹"+x);
        }
    }
    //转动转轮
    public static void test3(Gun gun){
        System.out.println("转动转轮前的needle是："+gun.getNeedlel());
        gun.turn();
        System.out.println("转动转轮后的needle是："+gun.getNeedlel());
    }
}
